package com.xywang.controller;

import com.alibaba.fastjson.JSONArray;
import com.mysql.cj.util.StringUtils;
import com.xywang.dao.role.RoleDao;
import com.xywang.pojo.Role;
import com.xywang.pojo.User;
import com.xywang.service.user.UserService;
import com.xywang.util.Constants;
import com.xywang.util.PageSupport;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpSession;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

@Controller
@RequestMapping("/jsp")
public class UserController {
    private UserService userServiceImpl;
    private PageSupport pageSupport;
    private RoleDao roleDaoImpl;
    @Autowired
    public void setRoleDaoImpl(RoleDao roleDaoImpl) {
        this.roleDaoImpl = roleDaoImpl;
    }
    @Autowired
    public void setUserServiceImpl(UserService userServiceImpl) {
        this.userServiceImpl = userServiceImpl;
    }
    @Autowired
    public void setPageSupport(PageSupport pageSupport) {
        this.pageSupport = pageSupport;
    }

    // 展示用户列表，可以通过名字角色查询，有分页
    @RequestMapping("/showUserList")
    public String getUserList(String queryname, String queryUserRole, String pageIndex, Model model){
        // 角色默认为0，就是没有角色
        int queryRole = 0;

        // 第一次走这个请求，一定是第一页，页面大小固定的
        int pageSize = Constants.PageSize;
        int currentPageNo=1;

        // 用户名
        if (queryname == null) {
            /* 如果为空，则手动赋值,假如没有赋值，则null会被当作参数传递到dao层，
           以【 %null% 】作为参数运行sql语句，结果是什么都查不到，
           赋值后以【 %% 】为参数执行sql，会查出所有用户
            */
            queryname = "";
        }
        // 角色
        if (queryUserRole != null && !queryUserRole.equals("")) {
            queryRole = Integer.parseInt(queryUserRole);// 给查询赋值 0\1\2\3
        }
        // 当前‘页’
        if (pageIndex != null) {
            try{
                currentPageNo = Integer.parseInt(pageIndex);
            }catch (Exception e){
                return "redirect:/error.jsp";
            }
        }
        // 获取用户总条数 (分页 ：上一页，下一页)
        int userTotalCount = userServiceImpl.getUserCount(queryname, queryRole);

        // 总页数支持
        /*
            将 当前页、页面大小、用户总数量传给 PageSupport 类，
            然后根据参数获取总页数
        */
        pageSupport.setCurrentPageNo(currentPageNo);
        pageSupport.setPageSize(pageSize);
        pageSupport.setTotalCount(userTotalCount);
        // 总页数 getTotalPageCount()
        int totalPageCount = pageSupport.getTotalPageCount();
        // 控制首页和尾页
        if(currentPageNo<1){
            currentPageNo = 1;
        }else if(currentPageNo>totalPageCount){
            currentPageNo = totalPageCount;
        }

        // 获取用户列表展示
        List<User> userList = userServiceImpl.getUserList(queryname, queryRole, currentPageNo, pageSize);
        // 通过请求req，将参数传给前端页面
        model.addAttribute("userList",userList);

        // 获取角色列表，通过请求req，将参数传给前端页面
        List<Role> roleListService = roleDaoImpl.getRoleListDao();
        model.addAttribute("roleList",roleListService);

        // 分页
        model.addAttribute("totalCount",userTotalCount);// 用户总数
        model.addAttribute("currentPageNo",currentPageNo);// 当前页
        model.addAttribute("totalPageCount",totalPageCount);// 总页数
        model.addAttribute("queryUserName", queryname);// 用户名
        model.addAttribute("queryUserRole",queryRole);// 角色

        // 请求转发到 userList.jsp 用户列表页面 同时携带上面设置的数据
        return "userList";
    }

    // 跳转到添加用户界面
    @RequestMapping("/useradd")
    public String userAdd(){
        return "userAdd";
    }

    // 添加用户页面，通过ajax判断某个userCode是否已经存在
    @RequestMapping("/userCodeIsExist")
    @ResponseBody //它就不会走视图解析器，会直接返网一个字符串
    public String userCodeIsExist(String userCode){
        HashMap<String, String> resultMap = new HashMap<String,String>();
        if (StringUtils.isNullOrEmpty(userCode)) {
            resultMap.put("userCode", "exist");
        } else {
            User user = userServiceImpl.selectUserByCode(userCode);
            if (null != user) {
                resultMap.put("userCode", "exist");
            } else {
                resultMap.put("userCode", "notexist");
            }
        }
        //把resultMap转为json字符串以json的形式输出
        return JSONArray.toJSONString(resultMap);
    }

    @RequestMapping("/addUserDo")
    public String addUser(@RequestParam("userCode") String userCode,
                          @RequestParam("userName") String userName,
                          @RequestParam("userPassword") String userPassword,
                          @RequestParam("gender") String gender,
                          @RequestParam("birthday") String birthday,
                          @RequestParam("phone") String phone,
                          @RequestParam("address") String address,
                          @RequestParam("userRole") String userRole,
                          HttpSession session)
    {
        User user = new User();
        // 将表单提交的数据封装到user对象
        user.setUserCode(userCode);
        user.setUserName(userName);
        user.setUserPassword(userPassword);
        user.setAddress(address);
        user.setBirthday(birthday);
        user.setGender(Integer.valueOf(gender));
        user.setPhone(phone);
        user.setUserRole(Integer.valueOf(userRole));
        user.setCreationDate(new Date());
        user.setCreatedBy(((User) session.getAttribute(Constants.USER_SESSION)).getId());

        System.out.println("addUser : "+user.toString());
        if (userServiceImpl.addUserService(user)) {
            return "redirect:/jsp/showUserList";
        }else{
            return "useradd";
        }
    }

    // 删除用户，并向前端发送是否删除成功的信息
    @RequestMapping("/delUser")
    @ResponseBody
    public String delUser(String uid){
        int delId = Integer.parseInt(uid);

        HashMap<String, String> resultMap = new HashMap<String, String>();
        if (delId <= 0) {
            resultMap.put("delResult", "notexist");
        } else {
            if (userServiceImpl.deleteUserService(delId)) {
                resultMap.put("delResult", "true");
            } else {
                resultMap.put("delResult", "false");
            }
        }
        return JSONArray.toJSONString(resultMap);
    }

    // 通过id获取用户信息，再通过model发送到前端展示
    @RequestMapping("/userView")
    public String userView(String uid,Model model){
        if (!StringUtils.isNullOrEmpty(uid)) {
            //调用后台方法得到user对象
            User user = userServiceImpl.getUserByIdService(Integer.parseInt(uid));
            model.addAttribute("user", user);
            return "userView";
        }
        return "../../error";
    }

    // 点击页面修改用户图标，通过js文件访问url，到这里获得点击用户id的信息
    @RequestMapping("/userModify")
    public String userModify(String uid,Model model){
        if (!StringUtils.isNullOrEmpty(uid)) {
            //调用后台方法得到user对象
            User user = userServiceImpl.getUserByIdService(Integer.parseInt(uid));
            model.addAttribute("user", user);
            System.out.println("userModify->"+user);
            return "userModify";
        }
        return "../../error";
    }
    // 获取前端表单提交的数据，修改数据库信息
    @RequestMapping("/modifyExe")
    public String modifyExe(User user, HttpSession session){
        user.setModifyBy(((User) session.getAttribute(Constants.USER_SESSION)).getId());
        user.setModifyDate(new Date());
        if (userServiceImpl.updateUserService(user)) {
            return "redirect:/jsp/showUserList";
        } else {
            return "/userModify";
        }
    }
}
